人工智能学习 8 - Numpy

Numpy 基础

参考: https://www.numpy.org.cn/numpy docs

numpy 是一个 C 实现的计算库, 开源且性能优异, 是众多科学库的依赖

ndarray 向量/线性方程组运算

  • 数组点积 dot (对应元素相乘)
  • 向量点积 vdot
  • 数组内积 inner
  • 数组矩阵积 matmul
  • 数组行列式 determinant
  • 求解线性矩阵方程 solve
  • 计算逆矩阵 inv

ndarray 底层是 C 实现, 所以要求数据类型一致

1
2
3
import numpy ad np

arr = np.array([])

查看函数的使用方法, 鼠标在括号内, Mac 按 Command, Win 按 Alt 查看帮助.

ndarray 的属性

  • shape 形状
  • ndim 维度
  • dtype 数据类型
  • itemsize 数据大小(dtype 数据类型占空间字节数)
  • size 数组长度(多少个数)

创建 ndarray 并填充初始值

  • np.zeros(shape) 使用 0 填充
  • np.ones(shape) 使用 1 填充
  • np.empty(shape) 创建但是不赋初始值
  • np.full(shape, value) 使用自定义填充
  • np.arange(count).reshape(shape) 创建一个指定数量的一维数组, 重新改写形状

类似的有 ones_like(), empty_like(), zeros_like(), full_like() 使用 ndarray 替代 shape 参数

  • np.random.randint(low, high, size) 随机整数范围 [low, high)
  • np.random.random(size) 随机浮点数 [0,1)

基本用法

索引(逗号)与切片(冒号)

  • v = np.arange(start, end, step)
  • v[x,y], v[start:end:step]

[:] 指的是该维度上的所有, [...] 表示所有其他维度

数组做 nd 的下标

使用一维或多维数组做 nd 的下标, 相当于将 nd 的值放到数组的对应位置

  • a[[1,2,5]] 取 a 中 id 为 1,2,5 的元素组成新 nd,
  • a[[1,2,5]] = [1,1,1] 可以赋值给 nd array
  • a[[1,2,5]] += 1 可以对 nd array 运算

在一维数组 a 中取值 a[x], 在多维数组 b 中取值 b[x, y] 其中 x,y 都是目标形状的数组

  • a 的 x 可以是一维也可以多维, 就是把 a 对应位置的值填到数组中

布尔数组 做 nd 的下标

值为 True/False 的数组

b = a > 0 所有为真的位置为 True
a[a<0] = 0 将所有 < 0 的标记为 True, 又将下标 True 的值置位 0

切片的区别

list [:] 切片创建指针数据副本(还指向源数据,修改时指向新数据)
nd [:] 切片指向原内存修改原数据改变, nd [id] 索引创建数据副本修改原数据不变

广播

维度不同, 后缘维度轴长相同: (x,y) vs. (y,z)

维度相同, 其中有一个轴为 1: (x,y,1,v) vs. (x,1,u,v)

  • np.broadcast_to(dt, shape) 根据条件配置进行广播
  • np.expand_dims(dt, axis) 在指定轴上拓展一个长度为 1 的维度
  • np.squeeze(dt) 删除长度为 1 的轴, 降维

矩阵的变换

  • 转置(行变列) dt.Tnp.transpose(dt, axes), 默认是将 shape 反过来
  • 翻转(基于轴镜像) np.flip(dt, axis)
  • 交换(两个轴交换) np.swapaxes(dt, src, tar)
  • 滚动(轴滚动到轴前) np.rollaxis(dt, id, before)

拼接与分割

拼接

  • np.concatenate((a,b), axis) 指定方向维度拼接
  • np.hstake((a,b))np.r_[a,b] horizon, row 拼接
  • np.vstake((a,b))np.c_[a,b] vertical, column 拼接

分割

  • np.split(a, count) 平均切成几段
  • np.split(a, [id, id...]) 在指定位置切分成几段
  • np.hsplit(a, count) row 分割
  • np.vsplit(a, count) column 分割

检索元素

  • np.argmax(a) 最大值所在位置
  • np.argmin(a) 最小值所在位置
  • np.where(cond) 符合条件的元素 id 列表
  • np.where(cond, True 填充默认原值, False 填充默认 0)
  • a[np.where(cond)] 基于条件选择下标

IO 操作

1
2
3
4
5
6
7
8
9
dt = np.array()

# save txt data
np.savetxt("./path/filename.txt", dt)
dt = np.loadtxt("./path/filename.txt", skiprows=1)

# save binary data
np.save("./path/filename.npy", dt)
dt = np.load("./path/filename.npy")
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.